#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>

// 全局变量 i，用于记录从程序启动开始经过的秒数
int i = 0;

// 将以毫秒为单位的时间转换为 struct timeval 结构体所需的秒和微秒格式
// ms: 输入的毫秒数
// ptVal: 指向 struct timeval 结构体的指针，用于存储转换后的时间
void timeChange(int ms, struct timeval *ptVal) {
    // 计算秒数
    ptVal->tv_sec = ms / 1000;
    // 计算微秒数
    ptVal->tv_usec = (ms % 1000) * 1000;
}

// 信号处理函数，当接收到 SIGALRM 信号时会被调用
// SignNo: 接收到的信号编号，这里是 SIGALRM
void alarmsign_handler(int SignNo) {
    // 每次调用该函数时，i 的值会加 1，并打印出经过的秒数
    printf("%d seconds\n", ++i);
}

int main() {
    // 定义一个 struct itimerval 结构体变量，用于设置定时器的初始值和间隔值
    struct itimerval tval;

    // 将 SIGALRM 信号的处理函数设置为 alarmsign_handler
    signal(SIGALRM, alarmsign_handler);

    // 设置定时器的初始值为 1 毫秒，即定时器将在 1 毫秒后首次触发
    timeChange(1, &(tval.it_value));

    // 设置定时器的间隔值为 1000 毫秒（即 1 秒），即定时器首次触发后，每隔 1 秒触发一次
    timeChange(1000, &(tval.it_interval));

    // 启动定时器，使用 ITIMER_REAL 表示使用真实时间计时
    setitimer(ITIMER_REAL, &tval, NULL);

    // 进入一个无限循环，等待用户输入字符 '#'
    // 当用户输入 '#' 时，程序退出循环并结束
    while (getchar() != '#');

    return 0;
}